#pragma once

#include <cstdio>
#include "Common.hpp"
#include "Log.hpp"

using namespace LogModule;

class Command
{
public:
    std::string Execute(const std::string& cmd,const InetAddr& client)
    {
        FILE* file_ptr = popen(cmd.c_str(),"r"); // 将子进程的标准输出重定向到管道的w端
        if(file_ptr == nullptr)
        {
            LOG(LogLevel::WARNING) << client.StringAddr() << "# " << cmd << " 该命令无效!";
            return "你要执行的命令无效: "+cmd;
        }

        std::string result;
        char line[256];
        // char *fgets(char *str, int n, FILE *stream);
        // 第二个参数 n 的含义是：最多读取 n-1 个字符到 str 中,自动在末尾加 '\0'。
        // snprintf也是
        while(fgets(line,sizeof(line),file_ptr))
        {
            result += line; 
        }

        pclose(file_ptr);

        LOG(LogLevel::DEBUG) << client.StringAddr() << "# " << result;

        return "execute done, result is: \n" + result;
    }
};